home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 3 / Amiga Tools 3.iso / grafik / raytracing / rayshade-4.0.6.3 / fixes / fix024 / libray / libcommon / transform.c.diff < prev    next >
Encoding:
Text File  |  1994-08-09  |  5.0 KB  |  156 lines

  1. *** transform.c    Mon Oct 11 15:00:58 1993
  2. --- transform.c.frac    Mon Oct 11 14:47:18 1993
  3. ***************
  4. *** 305,310 ****
  5. --- 305,418 ----
  6.       MatrixCopy(&ttmp, inverse);
  7.   }
  8.   
  9. + /* find eigenvalues of positive definite matrices, return FALSE is singular. */
  10. + int MatrixEigenvalues(trans, lambda)
  11. + RSMatrix *trans;
  12. + Float lambda[3];
  13. + {
  14. +         Float a[3], maxval, a11, a12, a21, a22;
  15. +         Float *A[3];
  16. +         a[0] = fabs(trans->matrix[0][0]); maxval = a[0];
  17. +         a[1] = fabs(trans->matrix[1][0]); if (a[1] > maxval) maxval = a[1];
  18. +         a[2] = fabs(trans->matrix[2][0]); if (a[2] > maxval) maxval = a[2];
  19. +   
  20. +         if (maxval == a[0]) {
  21. +                 A[0] = trans->matrix[0];
  22. +                 A[1] = trans->matrix[1];
  23. +                 A[2] = trans->matrix[2];
  24. +         } else if (maxval == a[1]) {
  25. +                 A[0] = trans->matrix[1];
  26. +                 A[1] = trans->matrix[0];
  27. +                 A[2] = trans->matrix[2];
  28. +         } else {
  29. +                 A[0] = trans->matrix[2];
  30. +                 A[1] = trans->matrix[1];
  31. +                 A[2] = trans->matrix[0];
  32. +         }
  33. +         lambda[0] = A[0][0];
  34. +         if (lambda[0] == 0.) return FALSE;
  35. +         a[1] = A[1][0] / lambda[0];
  36. +         a[2] = A[2][0] / lambda[0];
  37. +         a11 = A[1][1] - a[1] * A[0][1];        
  38. +         a21 = A[2][1] - a[2] * A[0][1];        
  39. +         a12 = A[1][2] - a[1] * A[0][2];        
  40. +         a22 = A[2][2] - a[2] * A[0][2];        
  41. +         if (fabs(a11) > fabs(a21)) {
  42. +                 lambda[1] = a11;
  43. +                 if (lambda[1] == 0.) return FALSE;
  44. +                 lambda[2] = a22 - a21/a11 * a12;
  45. +         } else {
  46. +                 lambda[1] = a21;
  47. +                 if (lambda[1] == 0.) return FALSE;
  48. +                 lambda[2] = a12 - a11/a21 * a22;
  49. +         }
  50. +         if (lambda[2] == 0.) return FALSE;
  51. +         return TRUE;
  52. + }
  53. + /* Lipschitz number for euclidian norm: largest scaling factor */
  54. + Float Lipschitz(lambda)
  55. + Float lambda[3];
  56. + {
  57. +         Float maxlambda;
  58. +         maxlambda = lambda[0];
  59. +         if (lambda[1] > maxlambda) maxlambda = lambda[1];
  60. +         if (lambda[2] > maxlambda) maxlambda = lambda[2];
  61. +         return maxlambda;
  62. + }
  63. + /* returns TRUE if the three scaling factors are equal */
  64. + int Uniform(lambda)
  65. + Float lambda[3];
  66. + {
  67. +         return (equal(lambda[0], lambda[1]) && equal(lambda[1], lambda[2]));
  68. + }
  69. + /* scaling factors */
  70. + int MatrixScaling(trans, lambda)
  71. + RSMatrix *trans;
  72. + Float lambda[3];
  73. + {
  74. +         RSMatrix Q2;
  75. +         int i;
  76. + /* Q-R decomposition: we are only interested in Q**2 */
  77. +         Q2.matrix[0][0] = trans->matrix[0][0] * trans->matrix[0][0] +
  78. +                           trans->matrix[0][1] * trans->matrix[0][1] +
  79. +                           trans->matrix[0][2] * trans->matrix[0][2] ;
  80. +         Q2.matrix[0][1] = trans->matrix[0][0] * trans->matrix[1][0] +
  81. +                           trans->matrix[0][1] * trans->matrix[1][1] +
  82. +                           trans->matrix[0][2] * trans->matrix[1][2] ;
  83. +         Q2.matrix[0][2] = trans->matrix[0][0] * trans->matrix[2][0] +
  84. +                           trans->matrix[0][1] * trans->matrix[2][1] +
  85. +                           trans->matrix[0][2] * trans->matrix[2][2] ;
  86. +         Q2.matrix[1][1] = trans->matrix[1][0] * trans->matrix[1][0] +
  87. +                           trans->matrix[1][1] * trans->matrix[1][1] +
  88. +                           trans->matrix[1][2] * trans->matrix[1][2] ;
  89. +         Q2.matrix[1][2] = trans->matrix[1][0] * trans->matrix[2][0] +
  90. +                           trans->matrix[1][1] * trans->matrix[2][1] +
  91. +                           trans->matrix[1][2] * trans->matrix[2][2] ;
  92. +         Q2.matrix[2][2] = trans->matrix[2][0] * trans->matrix[2][0] +
  93. +                           trans->matrix[2][1] * trans->matrix[2][1] +
  94. +                           trans->matrix[2][2] * trans->matrix[2][2] ;
  95. +         Q2.matrix[1][0] = Q2.matrix[0][1];
  96. +         Q2.matrix[2][0] = Q2.matrix[0][2];
  97. +         Q2.matrix[2][1] = Q2.matrix[1][2];
  98. + /* scaling factors are square root of eigenvalues of Q**2 */
  99. +         if (!MatrixEigenvalues(&Q2, lambda)) return FALSE;
  100. +         lambda[0] = sqrt(lambda[0]);
  101. +         lambda[1] = sqrt(lambda[1]);
  102. +         lambda[2] = sqrt(lambda[2]);
  103. +         return TRUE;
  104. + }
  105.   /*
  106.    * Apply a transformation to a point (translation affects the point).
  107.    */
  108. ***************
  109. *** 399,407 ****
  110.   Ray *ray;
  111.   RSMatrix *trans;
  112.   {
  113.       PointTransform(&ray->pos, trans);
  114.       VecTransform(&ray->dir, trans);
  115. !     return VecNormalize(&ray->dir);
  116.   }
  117.   
  118.   void
  119. --- 507,519 ----
  120.   Ray *ray;
  121.   RSMatrix *trans;
  122.   {
  123. +         Float stretch;
  124.       PointTransform(&ray->pos, trans);
  125.       VecTransform(&ray->dir, trans);
  126. !     stretch = VecNormalize(&ray->dir);
  127. !         ray->stretch *= stretch;
  128. !         return stretch;
  129.   }
  130.   
  131.   void
  132. ***************
  133. *** 433,437 ****
  134. --- 545,552 ----
  135.   {
  136.       TransCopy(list, result);
  137.       for (list = list->next; list; list = list->next)
  138. + /* it was: 
  139.           TransCompose(list, result, result);
  140. +  * PhB made it: */
  141. +         TransCompose(result, list, result);
  142.   }
  143.